<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>解决问题</title>
</head>

<body>
    <script>
        /*
        解决问题
          +原型
            =>概念：每一个构造函数天生自带一个prototype属性，是一个对象数据类型
            =>概念：每一个对象天生自带一个属性 __proto__，指向所属构造函数的prototype
            =>概念：当你访问对象的成员的时候，首先在自己身上查找，如果没有，自动去到__proto__上查找
          +原型如何解决问题
            =>我们把需要添加给实例的方法，放在构造函数的原型(prototype)上
            =>就可以有实例进行访问使用
          +原型：
            =>构造函数天生自带一个prototype
            =>作用：有构造函数添加方法，专门为实例对象使用
        */

        //当函数被书写完毕以后
        //就会有prototype出现
        // function Person(){}

        // //直接向prototype内添加一些成员
        // Person.prototype.a=100
        // Person.prototype.b=100

        // console.log(Person.prototype)

        // //创建一个实例对象
        // //p1所属的构造函数就是Person
        // //p1.__proto__ 指向Person.prototype
        // var p1=new Person()
        // console.log(p1.__proto__ ===Person.prototype)//ture
        // console.log(p1.__proto__)//结果和console.log(Person.prototype)相同

        // //当你访问p1的a成员
        // //因为当你访问p1.a的时候，自己没有，会自动去自己的__proto__上查找
        // //又因为自己的 __proto_ 就是Person.prototype
        // //所以，其实就是去到Person.prototype上查找
        // console.log(p1.a)


        function Person(name, age) {
            //向实例对象上添加属性
            this.name = name
            this.age = age

            //向实例对象上添加方法
            // this.sayHi=function(){console.log('hello,world')}
        }

        //把想添加给实例对象的方法，书写在原型上，在原型上添加sayHi成员
        Person.prototype.sayHi = function () { console.log('hello,world') }

        //创建实例对象
        //p1和p2所属的构造函数就是Person
        var p1 = new Person('Jack', 18)
        var p2 = new Person('Rose', 20)

        console.log(p1)
        console.log(p2)

        p1.sayHi()
        p2.sayHi()

        //p1.__proto__ ===Person.prototype
        //p2.__proto__ ===Person.prototype
        console.log(p1.__proto__ === Person.prototype)
        console.log(p2.__proto__ === Person.prototype)
        // //因为当你访问p1.sayHi和p2.sayHi的时候，自己没有，会自动去自己的__proto__上查找
        // //又因为自己的 __proto_ 就是Person.prototype
        console.log(p1.sayHi)
        console.log(p2.sayHi)

        //因为p1.__proto__和p2.__proto__是一个对象空间
        //p1和p2的sayHi是一个
        console.log(p1.sayHi === p2.sayHi)//结果为true 节省内存空间
    </script>
</body>

</html>